#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project ：图灵学习 
@File    ：6.基于类的装饰器.py
@IDE     ：PyCharm 
@Author  ：ChenLiGao
@Date    ：2024-10-28 15:36
'''
"""
    __init__
    __new__
    __iter__
    __name__
    __str__
    __repr__ 在ipython交互环境最终使用
    __mro__
    __doc__
    __call__ 可以让一个实例对象像函数一样被调用
上下文管理器协议：
    __enter__
    __exit__
    __del__ 在一个类的生命走起末端自动调用方法
"""

class Person:

    def __call__(self, *args, **kwargs):
        print(args, kwargs)

p = Person()
p("安娜", gender="女")

"""
    基于__call__方法定义类装饰器
"""

class Log:
    def __init__(self, func_obj):
        print(id(self))
        self.func_obj = func_obj

    def __call__(self, *args, **kwargs):
        print(f"[{self.func_obj.__name__}]")
        print(f"args的值：{args}，kwargs的值：{kwargs}")
        self.func_obj(*args, **kwargs)

    def run(self):
        print("这是一个run方法")



@Log
def say_hello(): # 被装饰器装饰的函数地址发生了改变，变更成了装饰器的实例对象地址
    print("hello")

say_hello()
say_hello.run()